package main

import (
	"fmt"
	"math"
)

func compute(fn func(float64, float64) float64) float64 {
	result := fn(3, 4)
	return result
}

func main() {
	//MARK 函数也是值 
	var hypot func(x, y float64) float64
	//fmt.Println(hypot(5, 12))//MARK nil值是不能用的 会报错
	
	//MARK 字面量赋值
	hypot = func(x, y float64) float64 {
		return math.Sqrt(x*x + y*y)
	}
	fmt.Println(hypot(5, 12))
	fmt.Println(compute(hypot))
	fmt.Println(compute(math.Pow))//MARK 其他包的函数
	
	hypot2:=hypot2//MARK 可以这样直接用外面定义的函数
	fmt.Println(hypot2(5, 12))
	
	closures()
}

func hypot2(x, y float64) float64 {
	return math.Sqrt(x*x + y*y)
}

func closures() {//闭包
	fmt.Println("============closures===============")
	pos := adder()
	for i := 0; i < 10; i++ {
		fmt.Println(
			pos(1),//每次都传1 却不同
		)
	}
}

func adder() func(int) int {
	sum := 0//MARK 闭包共享
	return func(x int) int {
		sum += x
		return sum
	}
}
